Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


Device.h HEAD (a42f8d32) Text, 8.10 KB

T8b949e// Copyright (C) 2024, Mark Qvist

T8b949e// This program is free software: you can redistribute it and/or modify
T8b949e// it under the terms of the GNU General Public License as published by
T8b949e// the Free Software Foundation, either version 3 of the License, or
T8b949e// (at your option) any later version.

T8b949e// This program is distributed in the hope that it will be useful,
T8b949e// but WITHOUT ANY WARRANTY; without even the implied warranty of
T8b949e// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
T8b949e// GNU General Public License for more details.

T8b949e// You should have received a copy of the GNU General Public License
T8b949e// along with this program. If not, see <https://www.gnu.org/licenses/>.

Tff7b72#Tff7b72include T8b949e<Ed25519.h>

Tff7b72#Tff7b72if MCU_VARIANT == MCU_ESP32
Tff7b72#Tff7b72include T8b949e"mbedtls/md.h"
Tff7b72#Tff7b72include T8b949e"esp_ota_ops.h"
Tff7b72#Tff7b72include T8b949e"esp_flash_partitions.h"
Tff7b72#Tff7b72include T8b949e"esp_partition.h"

Tff7b72#Tff7b72elif MCU_VARIANT == MCU_NRF52
Tff7b72#Tff7b72include T8b949e"Adafruit_nRFCrypto.h"

T8b949e// size of chunk to retrieve from flash sector
Tff7b72#Tff7b72define CHUNK_SIZE 128

Tff7b72#Tff7b72define END_SECTION_SIZE 256

Tff7b72#Tff7b72if defined(NRF52840_XXAA)
T8b949e// https://learn.adafruit.com/introducing-the-adafruit-nrf52840-feather/hathach-memory-map
T8b949e// each section follows along from one another, in this order
T8b949e// this is always at the start of the memory map
Tff7b72#Tff7b72define APPLICATION_START 0x26000

Tff7b72#Tff7b72define USER_DATA_START 0xED000

Tff7b72#Tff7b72define IMG_SIZE_START 0xFF008
Tff7b72#Tff7b72endif

Tff7b72#Tff7b72endif

T8b949e// Forward declaration from Utilities.h
Tffa657void Td2a8ffeeprom_updateTb4b4b4(Tffa657int Te6edf3mapped_addrTb4b4b4, Tffa657uint8_t Te6edf3byteTb4b4b4)Tb4b4b4;
Tffa657uint8_t Td2a8ffeeprom_readTb4b4b4(Tffa657uint32_t Te6edf3addrTb4b4b4)Tb4b4b4;
Tffa657void Td2a8ffhard_resetTb4b4b4(Tffa657voidTb4b4b4)Tb4b4b4;

Tff7b72#Tff7b72if !HAS_EEPROM && MCU_VARIANT == MCU_NRF52
Tffa657void Td2a8ffeeprom_flushTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif

Tff7b72const Tffa657uint8_t Te6edf3dev_keys Tb4b4b4[Tb4b4b4] Te6edf3PROGMEM Tff7b72= Tb4b4b4{
T79c0ff0x0fTb4b4b4, T79c0ff0x15Tb4b4b4, T79c0ff0x86Tb4b4b4, T79c0ff0x74Tb4b4b4, T79c0ff0xa0Tb4b4b4, T79c0ff0x7dTb4b4b4, T79c0ff0xf2Tb4b4b4, T79c0ff0xdeTb4b4b4, T79c0ff0x32Tb4b4b4, T79c0ff0x11Tb4b4b4, T79c0ff0x29Tb4b4b4, T79c0ff0xc1Tb4b4b4, T79c0ff0x0dTb4b4b4, T79c0ff0xdaTb4b4b4, T79c0ff0xccTb4b4b4, T79c0ff0xc3Tb4b4b4,
T79c0ff0xe1Tb4b4b4, T79c0ff0x9bTb4b4b4, T79c0ff0xacTb4b4b4, T79c0ff0xf2Tb4b4b4, T79c0ff0x27Tb4b4b4, T79c0ff0x06Tb4b4b4, T79c0ff0xeeTb4b4b4, T79c0ff0x89Tb4b4b4, T79c0ff0x1fTb4b4b4, T79c0ff0x7aTb4b4b4, T79c0ff0xfcTb4b4b4, T79c0ff0xc3Tb4b4b4, T79c0ff0x6aTb4b4b4, T79c0ff0xf5Tb4b4b4, T79c0ff0x38Tb4b4b4, T79c0ff0x08
Tb4b4b4}Tb4b4b4;

Tff7b72#Tff7b72define DEV_SIG_LEN 64
Tffa657uint8_t Te6edf3dev_sigTb4b4b4[Te6edf3DEV_SIG_LENTb4b4b4]Tb4b4b4;

Tff7b72#Tff7b72define DEV_KEY_LEN 32
Tffa657uint8_t Te6edf3dev_k_prvTb4b4b4[Te6edf3DEV_KEY_LENTb4b4b4]Tb4b4b4;
Tffa657uint8_t Te6edf3dev_k_pubTb4b4b4[Te6edf3DEV_KEY_LENTb4b4b4]Tb4b4b4;

Tff7b72#Tff7b72define DEV_HASH_LEN 32
Tffa657uint8_t Te6edf3dev_hashTb4b4b4[Te6edf3DEV_HASH_LENTb4b4b4]Tb4b4b4;
Tffa657uint8_t Te6edf3dev_partition_table_hashTb4b4b4[Te6edf3DEV_HASH_LENTb4b4b4]Tb4b4b4;
Tffa657uint8_t Te6edf3dev_bootloader_hashTb4b4b4[Te6edf3DEV_HASH_LENTb4b4b4]Tb4b4b4;
Tffa657uint8_t Te6edf3dev_firmware_hashTb4b4b4[Te6edf3DEV_HASH_LENTb4b4b4]Tb4b4b4;
Tffa657uint8_t Te6edf3dev_firmware_hash_targetTb4b4b4[Te6edf3DEV_HASH_LENTb4b4b4]Tb4b4b4;

Tff7b72#Tff7b72define EEPROM_SIG_LEN 128
Tffa657uint8_t Te6edf3dev_eeprom_signatureTb4b4b4[Te6edf3EEPROM_SIG_LENTb4b4b4]Tb4b4b4;

Tffa657bool Te6edf3dev_signature_validated Tff7b72= Tffa657falseTb4b4b4;
Tffa657bool Te6edf3fw_signature_validated Tff7b72= Tffa657trueTb4b4b4;

Tff7b72#Tff7b72define DEV_SIG_OFFSET EEPROM_SIZE-EEPROM_RESERVED-DEV_SIG_LEN
Tff7b72#Tff7b72define dev_sig_addr(a) (a+DEV_SIG_OFFSET)

Tff7b72#Tff7b72define DEV_FWHASH_OFFSET EEPROM_SIZE-EEPROM_RESERVED-DEV_SIG_LEN-DEV_HASH_LEN
Tff7b72#Tff7b72define dev_fwhash_addr(a) (a+DEV_FWHASH_OFFSET)

Tffa657bool Td2a8ffdevice_signatures_okTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3dev_signature_validated Tff7b72&Tff7b72& Te6edf3fw_signature_validatedTb4b4b4;
Tb4b4b4}

Tffa657void Td2a8ffdevice_validate_signatureTb4b4b4(Tb4b4b4) Tb4b4b4{
Tffa657int Te6edf3n_keys Tff7b72= Tff7b72sizeofTb4b4b4(Te6edf3dev_keysTb4b4b4)Tff7b72/Te6edf3DEV_KEY_LENTb4b4b4;
Tffa657bool Te6edf3valid_signature_found Tff7b72= Tffa657falseTb4b4b4;
Tff7b72for Tb4b4b4(Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3n_keysTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Te6edf3memcpyTb4b4b4(Te6edf3dev_k_pubTb4b4b4, Te6edf3dev_keysTff7b72+Te6edf3DEV_KEY_LENTff7b72*Te6edf3iTb4b4b4, Te6edf3DEV_KEY_LENTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3Ed25519Tff7b72:Tff7b72:Te6edf3verifyTb4b4b4(Te6edf3dev_sigTb4b4b4, Te6edf3dev_k_pubTb4b4b4, Te6edf3dev_hashTb4b4b4, Te6edf3DEV_HASH_LENTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3valid_signature_found Tff7b72= Tffa657trueTb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3valid_signature_foundTb4b4b4) Tb4b4b4{
Te6edf3dev_signature_validated Tff7b72= Tffa657trueTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3dev_signature_validated Tff7b72= Tffa657falseTb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tffa657void Td2a8ffdevice_save_signatureTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3device_validate_signatureTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3dev_signature_validatedTb4b4b4) Tb4b4b4{
Tff7b72for Tb4b4b4(Tffa657uint8_t Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3DEV_SIG_LENTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Te6edf3eeprom_updateTb4b4b4(Te6edf3dev_sig_addrTb4b4b4(Te6edf3iTb4b4b4)Tb4b4b4, Te6edf3dev_sigTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tffa657void Td2a8ffdevice_load_signatureTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72for Tb4b4b4(Tffa657uint8_t Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3DEV_SIG_LENTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if HAS_EEPROM
Te6edf3dev_sigTb4b4b4[Te6edf3iTb4b4b4] Tff7b72= Te6edf3EEPROMTb4b4b4.Te6edf3readTb4b4b4(Te6edf3dev_sig_addrTb4b4b4(Te6edf3iTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72elif MCU_VARIANT == MCU_NRF52
Te6edf3dev_sigTb4b4b4[Te6edf3iTb4b4b4] Tff7b72= Te6edf3eeprom_readTb4b4b4(Te6edf3dev_sig_addrTb4b4b4(Te6edf3iTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tb4b4b4}
Tb4b4b4}

Tffa657void Td2a8ffdevice_load_firmware_hashTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72for Tb4b4b4(Tffa657uint8_t Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3DEV_HASH_LENTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if HAS_EEPROM
Te6edf3dev_firmware_hash_targetTb4b4b4[Te6edf3iTb4b4b4] Tff7b72= Te6edf3EEPROMTb4b4b4.Te6edf3readTb4b4b4(Te6edf3dev_fwhash_addrTb4b4b4(Te6edf3iTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72elif MCU_VARIANT == MCU_NRF52
Te6edf3dev_firmware_hash_targetTb4b4b4[Te6edf3iTb4b4b4] Tff7b72= Te6edf3eeprom_readTb4b4b4(Te6edf3dev_fwhash_addrTb4b4b4(Te6edf3iTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tb4b4b4}
Tb4b4b4}

Tffa657void Td2a8ffdevice_save_firmware_hashTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72for Tb4b4b4(Tffa657uint8_t Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3DEV_HASH_LENTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Te6edf3eeprom_updateTb4b4b4(Te6edf3dev_fwhash_addrTb4b4b4(Te6edf3iTb4b4b4)Tb4b4b4, Te6edf3dev_firmware_hash_targetTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72if !HAS_EEPROM && MCU_VARIANT == MCU_NRF52
Te6edf3eeprom_flushTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3fw_signature_validatedTb4b4b4) Te6edf3hard_resetTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72#Tff7b72if MCU_VARIANT == MCU_NRF52
Tffa657uint32_t Td2a8ffretrieve_application_sizeTb4b4b4(Tb4b4b4) Tb4b4b4{
Tffa657uint8_t Te6edf3bytesTb4b4b4[T79c0ff4Tb4b4b4]Tb4b4b4;
Te6edf3memcpyTb4b4b4(Te6edf3bytesTb4b4b4, Tb4b4b4(Tff7b72const Tffa657voidTff7b72*Tb4b4b4)Te6edf3IMG_SIZE_STARTTb4b4b4, T79c0ff4Tb4b4b4)Tb4b4b4;
Tffa657uint32_t Te6edf3fw_len Tff7b72= Te6edf3bytesTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72| Te6edf3bytesTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72<Tff7b72< T79c0ff8 Tff7b72| Te6edf3bytesTb4b4b4[T79c0ff2Tb4b4b4] Tff7b72<Tff7b72< T79c0ff16 Tff7b72| Te6edf3bytesTb4b4b4[T79c0ff3Tb4b4b4] Tff7b72<Tff7b72< T79c0ff24Tb4b4b4;
Tff7b72return Te6edf3fw_lenTb4b4b4;
Tb4b4b4}

Tffa657void Td2a8ffcalculate_region_hashTb4b4b4(Tffa657unsigned Tffa657long Tffa657long Te6edf3startTb4b4b4, Tffa657unsigned Tffa657long Tffa657long Te6edf3endTb4b4b4, Tffa657uint8_tTff7b72* Te6edf3return_hashTb4b4b4) Tb4b4b4{
T8b949e// this function calculates the hash digest of a region of memory,
T8b949e// currently it is only designed to work for the application region
Tffa657uint8_t Te6edf3chunkTb4b4b4[Te6edf3CHUNK_SIZETb4b4b4] Tff7b72= Tb4b4b4{T79c0ff0Tb4b4b4}Tb4b4b4;

T8b949e// to store potential last chunk of program
Tffa657uint8_t Te6edf3chunk_nextTb4b4b4[Te6edf3CHUNK_SIZETb4b4b4] Tff7b72= Tb4b4b4{T79c0ff0Tb4b4b4}Tb4b4b4;
Te6edf3nRFCrypto_Hash Te6edf3hashTb4b4b4;

Te6edf3hashTb4b4b4.Te6edf3beginTb4b4b4(Te6edf3CRYS_HASH_SHA256_modeTb4b4b4)Tb4b4b4;

Tffa657uint8_t Te6edf3sizeTb4b4b4;

Tff7b72while Tb4b4b4(Te6edf3start Tff7b72< Te6edf3end Tb4b4b4) Tb4b4b4{
Tff7b72const Tffa657voidTff7b72* Te6edf3src Tff7b72= Tb4b4b4(Tff7b72const Tffa657voidTff7b72*Tb4b4b4)Te6edf3startTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3start Tff7b72+ Te6edf3CHUNK_SIZE Tff7b72>Tff7b72= Te6edf3endTb4b4b4) Tb4b4b4{
Te6edf3size Tff7b72= Te6edf3end Tff7b72- Te6edf3startTb4b4b4;
Tb4b4b4}
Tff7b72else Tb4b4b4{
Te6edf3size Tff7b72= Te6edf3CHUNK_SIZETb4b4b4;
Tb4b4b4}

Te6edf3memcpyTb4b4b4(Te6edf3chunkTb4b4b4, Te6edf3srcTb4b4b4, Te6edf3CHUNK_SIZETb4b4b4)Tb4b4b4;

Te6edf3hashTb4b4b4.Te6edf3updateTb4b4b4(Te6edf3chunkTb4b4b4, Te6edf3sizeTb4b4b4)Tb4b4b4;

Te6edf3start Tff7b72+Tff7b72= Te6edf3CHUNK_SIZETb4b4b4;
Tb4b4b4}
Te6edf3hashTb4b4b4.Te6edf3endTb4b4b4(Te6edf3return_hashTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif

Tffa657void Td2a8ffdevice_validate_partitionsTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3device_load_firmware_hashTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72if MCU_VARIANT == MCU_ESP32
Te6edf3esp_partition_t Te6edf3partitionTb4b4b4;
Te6edf3partitionTb4b4b4.Te6edf3address Tff7b72= Te6edf3ESP_PARTITION_TABLE_OFFSETTb4b4b4;
Te6edf3partitionTb4b4b4.Te6edf3size Tff7b72= Te6edf3ESP_PARTITION_TABLE_MAX_LENTb4b4b4;
Te6edf3partitionTb4b4b4.Te6edf3type Tff7b72= Te6edf3ESP_PARTITION_TYPE_DATATb4b4b4;
Te6edf3esp_partition_get_sha256Tb4b4b4(Tff7b72&Te6edf3partitionTb4b4b4, Te6edf3dev_partition_table_hashTb4b4b4)Tb4b4b4;
Te6edf3partitionTb4b4b4.Te6edf3address Tff7b72= Te6edf3ESP_BOOTLOADER_OFFSETTb4b4b4;
Te6edf3partitionTb4b4b4.Te6edf3size Tff7b72= Te6edf3ESP_PARTITION_TABLE_OFFSETTb4b4b4;
Te6edf3partitionTb4b4b4.Te6edf3type Tff7b72= Te6edf3ESP_PARTITION_TYPE_APPTb4b4b4;
Te6edf3esp_partition_get_sha256Tb4b4b4(Tff7b72&Te6edf3partitionTb4b4b4, Te6edf3dev_bootloader_hashTb4b4b4)Tb4b4b4;
Te6edf3esp_partition_get_sha256Tb4b4b4(Te6edf3esp_ota_get_running_partitionTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3dev_firmware_hashTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72elif MCU_VARIANT == MCU_NRF52
T8b949e// todo, add bootloader, partition table, or softdevice?
Te6edf3calculate_region_hashTb4b4b4(Te6edf3APPLICATION_STARTTb4b4b4, Te6edf3APPLICATION_STARTTff7b72+Te6edf3retrieve_application_sizeTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3dev_firmware_hashTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72for Tb4b4b4(Tffa657uint8_t Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3DEV_HASH_LENTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3dev_firmware_hash_targetTb4b4b4[Te6edf3iTb4b4b4] Tff7b72!Tff7b72= Te6edf3dev_firmware_hashTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4) Tb4b4b4{
Te6edf3fw_signature_validated Tff7b72= Tffa657falseTb4b4b4;
Tff7b72breakTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tffa657bool Td2a8ffdevice_firmware_okTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3fw_signature_validatedTb4b4b4;
Tb4b4b4}

Tff7b72#Tff7b72if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52
Tffa657bool Td2a8ffdevice_initTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if VALIDATE_FIRMWARE
Tff7b72if Tb4b4b4(Te6edf3bt_readyTb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if MCU_VARIANT == MCU_ESP32
Tff7b72for Tb4b4b4(Tffa657uint8_t Te6edf3iTff7b72=T79c0ff0Tb4b4b4; Te6edf3iTff7b72<Te6edf3EEPROM_SIG_LENTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4)Tb4b4b4{Te6edf3dev_eeprom_signatureTb4b4b4[Te6edf3iTb4b4b4]Tff7b72=Te6edf3EEPROMTb4b4b4.Te6edf3readTb4b4b4(Te6edf3eeprom_addrTb4b4b4(Te6edf3ADDR_SIGNATURETff7b72+Te6edf3iTb4b4b4)Tb4b4b4)Tb4b4b4;Tb4b4b4}
Te6edf3mbedtls_md_context_t Te6edf3ctxTb4b4b4;
Te6edf3mbedtls_md_type_t Te6edf3md_type Tff7b72= Te6edf3MBEDTLS_MD_SHA256Tb4b4b4;
Te6edf3mbedtls_md_initTb4b4b4(Tff7b72&Te6edf3ctxTb4b4b4)Tb4b4b4;
Te6edf3mbedtls_md_setupTb4b4b4(Tff7b72&Te6edf3ctxTb4b4b4, Te6edf3mbedtls_md_info_from_typeTb4b4b4(Te6edf3md_typeTb4b4b4)Tb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4;
Te6edf3mbedtls_md_startsTb4b4b4(Tff7b72&Te6edf3ctxTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72if HAS_BLUETOOTH == true || HAS_BLE == true
Te6edf3mbedtls_md_updateTb4b4b4(Tff7b72&Te6edf3ctxTb4b4b4, Te6edf3dev_bt_macTb4b4b4, Te6edf3BT_DEV_ADDR_LENTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72else
T8b949e// TODO: Get from BLE stack instead
T8b949e// mbedtls_md_update(&ctx, dev_bt_mac, BT_DEV_ADDR_LEN);
Tff7b72#Tff7b72endif
Te6edf3mbedtls_md_updateTb4b4b4(Tff7b72&Te6edf3ctxTb4b4b4, Te6edf3dev_eeprom_signatureTb4b4b4, Te6edf3EEPROM_SIG_LENTb4b4b4)Tb4b4b4;
Te6edf3mbedtls_md_finishTb4b4b4(Tff7b72&Te6edf3ctxTb4b4b4, Te6edf3dev_hashTb4b4b4)Tb4b4b4;
Te6edf3mbedtls_md_freeTb4b4b4(Tff7b72&Te6edf3ctxTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72elif MCU_VARIANT == MCU_NRF52
Tff7b72for Tb4b4b4(Tffa657uint8_t Te6edf3iTff7b72=T79c0ff0Tb4b4b4; Te6edf3iTff7b72<Te6edf3EEPROM_SIG_LENTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4)Tb4b4b4{Te6edf3dev_eeprom_signatureTb4b4b4[Te6edf3iTb4b4b4]Tff7b72=Te6edf3eeprom_readTb4b4b4(Te6edf3eeprom_addrTb4b4b4(Te6edf3ADDR_SIGNATURETff7b72+Te6edf3iTb4b4b4)Tb4b4b4)Tb4b4b4;Tb4b4b4}
Te6edf3nRFCryptoTb4b4b4.Te6edf3beginTb4b4b4(Tb4b4b4)Tb4b4b4;

Te6edf3nRFCrypto_Hash Te6edf3hashTb4b4b4;

Te6edf3hashTb4b4b4.Te6edf3beginTb4b4b4(Te6edf3CRYS_HASH_SHA256_modeTb4b4b4)Tb4b4b4;

Tff7b72#Tff7b72if HAS_BLUETOOTH == true || HAS_BLE == true
Te6edf3hashTb4b4b4.Te6edf3updateTb4b4b4(Te6edf3dev_bt_macTb4b4b4, Te6edf3BT_DEV_ADDR_LENTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72else
T8b949e// TODO: Get from BLE stack instead
T8b949e// hash.update(dev_bt_mac, BT_DEV_ADDR_LEN);
Tff7b72#Tff7b72endif
Te6edf3hashTb4b4b4.Te6edf3updateTb4b4b4(Te6edf3dev_eeprom_signatureTb4b4b4, Te6edf3EEPROM_SIG_LENTb4b4b4)Tb4b4b4;

Te6edf3hashTb4b4b4.Te6edf3endTb4b4b4(Te6edf3dev_hashTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif

Te6edf3device_load_signatureTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3device_validate_signatureTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3device_validate_partitionsTb4b4b4(Tb4b4b4)Tb4b4b4;

Tff7b72#Tff7b72if MCU_VARIANT == MCU_NRF52
Te6edf3nRFCryptoTb4b4b4.Te6edf3endTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Te6edf3device_init_done Tff7b72= Tffa657trueTb4b4b4;
Tff7b72return Te6edf3device_init_done Tff7b72&Tff7b72& Te6edf3fw_signature_validatedTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72return Tffa657falseTb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72else
T8b949e// Skip hash comparison and checking BT
Te6edf3device_init_done Tff7b72= Tffa657trueTb4b4b4;
Tff7b72return Te6edf3device_init_doneTb4b4b4;
Tff7b72#Tff7b72endif
Tb4b4b4}
Tff7b72#Tff7b72endif


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────